RubyKaigi 2022 Day 1 Ruby meets WebAssembly
Ruby meets WebAssembly - RubyKaigi 2022
Ruby WASM
CRubyをWASMに移植するプロジェクト
Ruby 3.2でリリース予定
モチベーション
Rubyは書きやすい
Rubyの難しさ
実行にはRubyインタープリターのインストールが必要
Rubyをインストールせずに使いたい場合、大変
インストールバトル
ビルド、インストールが難しい
Ruby + WASM
WASMはゲームチェンジャー
ポータブル
言語非依存
Sandbox
ブラウザでRubyを実行できる
インストールも不要
WASMはx86やarmのレイヤー
デモ
hello world
vim
code:html
script ruby-head-wasm-wasi
script type=text/ruby
require "js"
document = JS.global:document
document.write "hello"
ruby run -e httpd
HTML/JS/DOMのAPIをrubyで触れる
https://github.com/ruby/ruby.wasm
irb on WASM
ブラウザ上でirbが動く
ブラウザ上のirbでgemが使える
ブラウザ上のsandbox内にgemがインストールされる
Term.echoでirbのアウトプットとしてHTMLを書ける
https://irt-wasm.vercel.app/
WASM and WASI
WASI
標準化されたシステムコールの仕様
WASMはファイルシステムなし、ネットワークなし、時計もなし
WASMにないものはJSにやらせている
WASMはブラウザに限らないものになっている
サーバーレスシステム
プラグインシステム
WASI
標準化されたシステムコールインターフェース
WASI対応プラットフォーム
Node.js
Fastly
Cloudflare
VSCode Extension
WASI対応言語
C/C++
Rust
Swift
Ruby
WASI + VFS
.rbファイルを配置する必要がある
.rbをwasmに埋め込む
wasi-VFS
read-only in-memory FS
デモ
Fastly
require "compute_runtime"
前半まとめ
Ruby 3.2でWASMとWASIのサポートが入る
https://github.com/ruby/ruby.wasm でnpmパッケージとして配布
How to port CRuby to WASM and WASI
CRubyのムズいところ
Exceptions
setjmp/longjmp
Fiber
context-switch
保守的GC (Conservative GC)
CRubyはGCのためにメモリ状態を見ている
WASMはスタックマシン
Asyncify
Unwind / Rewind
コールスタックの状態をまるごと保存・復元
Locals
メモリ状態をシリアライズしてスキャン
FAQ
スレッド関連APIはなし
バイナリサイズは圧縮しても2MB弱、標準ライブラリ含めると圧縮しても5MB
パフォーマンスはCRubyの半分、mrubyと同じくらい
#RubyKaigi2022